import { Sky } from "./sky.js";
import { Land } from "./land.js";
import { Bird } from "./bird.js";
import { PipePareProducer } from "./pipe.js"
import { space, pipeSpace, gSpeed } from "./util.js";


class Game {
    constructor() {
        this.sky = new Sky(space);
        this.land = new Land(space);
        this.bird = new Bird();
        this.pipeProducer = new PipePareProducer(pipeSpace, gSpeed);
        this.timer = null;
        this.tick = 16;         // 移动时间
        this.gameOver = false;  // 是否结束
        this.regEvent();
    }

    // 开始游戏
    start() {
        if (this.timer) return false;
        // 游戏是否结束
        if (this.gameOver) {
            window.location.reload();  // 重新加载
        }
        // 开始生成柱子
        this.pipeProducer.startProduce();
        // 小鸟震动
        this.bird.startSwing();
        // 移动物体
        this.timer = setInterval(() => {
            const duration = this.tick / 1000;   // 移动每妙距离
            this.sky.move(duration);   // 天空移动
            this.land.move(duration)   // 大地移动
            this.bird.move(duration);  // 小鸟移动
            this.pipeProducer.pairs.forEach(pair => {
                pair.move(duration);
            });  // 柱子对移动
            if (this.isGameOver()) {  // 是否游戏结束
                this.stop();
                this.gameOver = true;
            }
        }, this.tick);
    }

    // 是否结束游戏
    isGameOver() {
        // 小鸟碰到大地
        if (this.bird.top === this.bird.maxY) return true;
        // 小鸟碰到天空
        if (this.bird === 0) return true;
        // 检测柱子碰撞(循环遍历)
        for (let i = 0; i < this.pipeProducer.pairs.length; i++) {
            let pair = this.pipeProducer.pairs[i];
            if (this.isHit(this.bird, pair.upPipe) || this.isHit(this.bird, pair.downPipe)) {
                return true
            }
        }
        return false;
    }

    // 暂停游戏
    stop() {
        clearInterval(this.timer);
        this.timer = null;
        this.bird.stopSwing();  // 暂停翅膀
        this.pipeProducer.stopProduce();  // 暂停柱子对产生
    }


    // 碰撞检测 (两个物体中间点检测)
    isHit(bird, pipe) {
        // 横向：两个矩形的中心点的横向距离，是否小于矩形宽度之和的一半
        // 纵向：两个矩形的中心点的纵向距离，是否小于矩形高度之和的一半
        // 小鸟中心
        let bridX = bird.left + bird.width / 2;
        let bridY = bird.top + bird.height / 2;
        // 柱子中心
        let pipeX = pipe.left + pipe.width / 2;
        let pipeY = pipe.top + pipe.height / 2;
        // 两点距离
        var disX = Math.abs(bridX - pipeX);
        var dixY = Math.abs(bridY - pipeY);
        if (disX < (bird.width + pipe.width) / 2 && dixY < (bird.height + pipe.height) / 2) {
            return true
        }
        return false

    }


    // 键盘事件
    regEvent() {
        window.onkeydown = (ev) => {
            if (ev.key === "Enter") {
                if (this.timer) {
                    this.stop();
                } else {
                    this.start();
                }
            }
            if (ev.key === " ") {
                this.bird.jump();
            }
        }
    }
}

new Game();


